-- TimeM
-- Create by zouyb
-- 时间相关模块

module("TimeM", package.seeall);

local socket = require "socket";

-- 客户端和服务器的时间差
local timeOffset = 0;
-- 客户端距离零时区的时间偏移量
local ctimeOffset = nil;
-- 服务器距离零时区的时间偏移量
local stimeOffset = nil;

-- 请求同步服务器时间
function sync()
    Operation.cmd_get_server_time();
end

-- 获取客户端偏移时间
function getClientOffset()
    local t = os.time();

    local localDate = os.date("*t", t);  -- 本地日期
    local utcDate = os.date("!*t", t);   -- utc日期

    -- 根据差值算出时区偏移值
    local offset = (localDate.yday - utcDate.yday) * 3600 * 24
                    + (localDate.hour - utcDate.hour) * 3600
                    + (localDate.min - utcDate.min) * 60
                    + (localDate.sec - utcDate.sec)

    return offset;
end

-- 计算与服务器时间偏移
function update(serverTime, clientTime, offset)
    local curClientTime = math.floor(socket.gettime());

    local curServerTime = serverTime + (curClientTime - clientTime) / 2

    timeOffset = (curServerTime - curClientTime);
    stimeOffset = offset;

    -- 抛出事件
    EventMgr.fire(event.TIME_OFFSET_ARRIVER, {});
end

-- 更新服务器距离零时区的时间偏移量
function updateServerTimeOffset(offset)
    -- 已废弃
end

-- 获取客户端、服务器偏移量差值
function getTimeOffsetDifference()
    if not stimeOffset then
        return 0;
    else
        return getClientOffset() - stimeOffset;
    end
end

-- 获取服务器时间
function getServerTime()
    local curClientTime = socket.gettime();
    return math.ceil(curClientTime + timeOffset);
end

-- 获取客户端时间
function getCurrentTime()
    return socket.gettime();
end

-- 计算到某一时刻倒计时的时间
-- 不传参数的话那么默认计算到当天凌晨的时间
-- 一小时以上，显示 "Xh"
-- 一小时以内，显示 "mm:ss"
-- @param hittingTime 倒计时到达时间 eg: os.time{year=1970, month=1, day=2, hour=0, min=0, sec=0}
function getCountDownTime(hittingTime)
    -- 获取时间戳的差值
    local remainingTime = 0;

    if hittingTime then
        remainingTime = os.time(hittingTime) - os.time();
    else
        local tableTime = os.date("*t", os.time() - TimeM.getTimeOffsetDifference());
        local dSecond = tableTime.hour * 3600 + tableTime.min * 60 + tableTime.sec;
        remainingTime = 86400 - dSecond;
    end

    return remainingTimeDesc(remainingTime);
end

-- 计算0点时间
function calcZeroTime(t)
    t = t or TimeM.getServerTime() - TimeM.getTimeOffsetDifference();

    local year  = os.date("%Y", t);
    local month = os.date("%m", t);
    local day   = os.date("%d", t);

    -- 00:00:00
    local var = {
        ["sec"]     = 0,
        ["min"]     = 0,
        ["hour"]    = 0,
        ["day"]     = day,
        ["month"]   = month,
        ["year"]    = year,
    };

    return os.time(var) + TimeM.getTimeOffsetDifference();
end